home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HPAVC
/
HPAVC CD-ROM.iso
/
KMAGV3.ZIP
/
KMAGUNIT.C
< prev
next >
Wrap
C/C++ Source or Header
|
1996-01-11
|
10KB
|
384 lines
//THE KING MAGAZINE UNIT FOR C //
//WRITING BY THE KING IN 01/02/96 //
#include <stdio.h>
#include <process.h>
#include <dos.h>
#include <conio.h>
#include <mem.h>
#define FALSE 0
#define TRUE 1
#define M_NONE 0
#define M_LEFT 1
#define M_RIGHT 2
#define M_LEFTRIGHT 3
#ifdef __cplusplus
#define __CPPARGS ...
#else
#define __CPPARGS
#endif*/
//struct for the 3 values of the palettes.
struct sRGB {
char red,green,blue;
};
//struct of 256 colors of the color type.
typedef sRGB PaletteType [256];
//mouse struct
struct mousestruct {
unsigned int x,y;
char buttons;
};
//CEL format header.
struct sCelHeader {
int sign; //sign of the .CEL format.
int w,h,x,y; //size and place..
char depth,compress; //compression type..
long data; //size of BITMAP.
char filler[16]; //Not use...
PaletteType pal; //The Pallette of the .CEL.
};
//keyboard keys.
char keys[128];
mousestruct mouse;
void interrupt(*old9int)(__CPPARGS);
//-------------------Set Modes Routines----------------//
//set mode to 320x200x256 colors..
void SetMode()
{
asm {
mov ah,0x00
mov al,0x13
int 0x10
}
}
//set to 80x25 text mode.
void SetTextMode()
{
asm {
mov ah,0x00
mov al,0x03
int 0x10
}
}
//----------------------------Graphics Routines-----------------------------//
//------------------------------------------------//
//Plot a single pixel on the screen . //
//------------------------------------------------//
void PutPixel(int X,int Y,unsigned char Col) {
asm {
mov ax,0xa000 //Ax = SEGMENT OF THE SCREEN//
mov es,ax //Es = SEGMENT OF THE SCREEN//
mov ax,320 //Ax = MAX VERTICAL LINE//
mul Y //Ax = AX * Y = HORIZONTAL LINE//
add ax,X //Ax = VERTICAL LINE + HORIZONTAL LINE = OFFSET//
mov di,ax //DI = OFFSET//
mov al,Col //AL = COLOR//
stosb //[0A000h:OFFSET] = COLOR//
}
}
//-----------------------------------------//
// Show Picture On Screen . //
//-----------------------------------------//
void ShowPic(unsigned char *Pic)
{
asm {
push ds
mov ax,word(Pic+2) //Take The Segment Of Pic
mov ds,ax
xor si,si //Si = 0
mov ax,0xa000
mov es,ax
xor di,di //Di = 0
mov cx,32000 //32000*2 = 64000
rep movsw //Move 32000*2 Bytes
pop ds
}
}
//------------------------------Palette Routines----------------------------//
//-------------------------------------------------------//
//Get Red Green And Blue From a Color //
//-------------------------------------------------------//
void GetColor(unsigned char Col,char &R,char &G,char &B)
{
asm {
mov dx,0x3c7 //Set To GET COLOR
mov al,Col
out dx,al
inc dx //Dx = 3c8H
inc dx //Dx = 3c9H
les di,R //Es:Di = R
in al,dx //Get Red Value
mov [es:di],al //R = Red Value
in al,dx //Get Green Value
les di,G //Es:Di = G
mov [es:di],al //G = Green Value
in al,dx //Get Blue Value
les di,B //Es:Di = B
mov [es:di],al //B = Blue Value
}
}
//-------------------------------------------------------//
//Set Red Green And Blue To a Color //
//-------------------------------------------------------//
void SetColor(unsigned char Col,char R,char G,char B)
{
asm {
mov dx,0x3c8 //SET TO SET COLOR
mov al,Col
out dx,al
inc dx //DX = 3c9h
mov al,R //Senting Red Value
out dx,al
mov al,G //Senting Green Value
out dx,al
mov al,B //Senting Blue Value
out dx,al
}
}
//---------------------------------------------------//
// Show The Palette //
//---------------------------------------------------//
void ShowPal(PaletteType Pal)
{
unsigned char t;
for(t=0;t<255;t++)
{
SetColor(t,Pal[t].red,Pal[t].green,Pal[t].blue);
}
}
//---------------------------------------------------//
// Get The Use Palette From The Screen //
//---------------------------------------------------//
void GetPal(PaletteType Pal)
{
unsigned char t;
for (t=0;t<255;t++)
{
GetColor(t,Pal[t].red,Pal[t].green,Pal[t].blue);
}
}
//---------------------------------------------------//
// Fade To The Screen From Palette To Palette. //
//---------------------------------------------------//
void FadeTo(PaletteType Pal,PaletteType ToPal)
{
unsigned char t,t1;
for(t1=1;t1<63;t++)
{
for(t=1;t1<255;t++)
{
if (Pal[t].red > ToPal[t].red)
Pal[t].red--;
if (Pal[t].red < ToPal[t].red)
Pal[t].red++;
if (Pal[t].green > ToPal[t].green)
Pal[t].green--;
if (Pal[t].green < ToPal[t].green)
Pal[t].green++;
if (Pal[t].blue > ToPal[t].blue)
Pal[t].blue--;
if (Pal[t].blue < ToPal[t].blue)
Pal[t].blue++;
}
ShowPal(Pal);
}
}
//-------------------------------File Formats-------------------------------//
char LoadCel(const char *name,unsigned char *Where,PaletteType Pal)
{
FILE *f;
sCelHeader Cel;
char loaded;
if((f = fopen(name,"rb")) != NULL) {
loaded = TRUE;
fread(&Cel,sizeof(sCelHeader)-768,1,f);
fread(Pal,sizeof(PaletteType),1,f);
fread(Where,64000,1,f);
fclose(f);
}
else
{
loaded = FALSE;
}
return(loaded);
}
//---------------------------------Effects----------------------------------//
//---------------------------------------------//
//Build The Picture Of The Cross Fade //
//---------------------------------------------//
void MakeCrossFade(unsigned char *Pic1,unsigned char *Pic2,
unsigned char *Pic3,PaletteType PalP1,
PaletteType PalP2,PaletteType PalCp1,
PaletteType PalCp2)
{
struct pixels {
unsigned char Pix1,Pix2;
};
pixels Colors[255];
unsigned int T;
unsigned int T1;
unsigned int Word;
unsigned char Pix1,Pix2;
unsigned int Num;
T=0;
Num = 1;
do{
Pix1 = Pic1[T];
Pix2 = Pic2[T];
for(T1=0;T1<Num-1;T1++){
if ((Num != 1) && (Pix1==Colors[T1].Pix1) && (Pix2==Colors[T1].Pix2))
{
Pic1[T] = T1;
T1=256;
break;
}
}
if (T1 != 256)
{
Pic3[T] = Num;
PalCp1[Num] = PalP1[Pix1];
PalCp2[Num] = PalP2[Pix2];
Colors[Num].Pix1 = Pix1;
Colors[Num].Pix2 = Pix2;
Num ++;
}
T++;
if(Num > 255) {
printf("More Then 256 Colors . ");
exit;
}
} while (T != 64000);
}
//-----------------------------Keyboard Routines------------------------------//
//--------------------------------------------//
//New Interrupt 9 for handle with the keyboard//
//--------------------------------------------//
void interrupt new9int(__CPPARGS){
asm {
mov ax,0x40
mov es,ax
mov di,0x17
mov ax,0
mov [es:di],ax
}
keys[inp(0x60) % 128] = (inp(0x60) < 128);
old9int();
asm {
mov al,0x20
out 0x20,al
}
asm {
mov ax,0x40
mov es,ax
mov di,0x1A
mov ds,ax
mov si,0x1c
mov ax,[ds:si]
mov [es:di],ax
}
}
//-------------------------------------------//
// Init The new interrupt //
//-------------------------------------------//
void InitKeyboard(){
memset(keys,0,sizeof(keys));
old9int = getvect(0x9);
setvect(0x9,new9int);
}
//--------------------------------------//
// Restore The Old interrupt //
//--------------------------------------//
void RestoreKeyBoard(){
setvect(0x9,old9int);
}
//------------------------------Mouse Routines------------------------------//
//--------------------------------------//
// Get the mouse status //
//--------------------------------------//
void GetMouse(mousestruct &Mouse)
{
asm {
push ds //Saving DS
mov ax,0x0003 //Function 0003H INT 33H GET STATUS
int 0x33
lds si,Mouse //[DS:SI] = MOUSE
shr cx,3 //FOR DIVIDE IT WITH 8
shr dx,3
mov [ds:si],cx //[DS:SI] = X = CX
mov [ds:si+2],dx //[DS:SI+2] = Y = DX
mov [ds:si+4],bx //[DS:SI+4] = BUTTON = BX
pop ds //Restoring DS
}
}
//Thus function Reseting the mouse and return true if the mouse is installed//
char ResetMouse()
{
char rett;
asm {
mov ax,0x0000
int 0x33
mov rett,al
}
return(rett);
}
//Show the mouse on the screen//
void ShowMouse(){
asm {
mov ax,0x0001
int 0x33
}
}
//Hide the mouse from the screen//
void HideMouse(){
asm {
mov ax,0x0002
int 0x33
}
}